home *** CD-ROM | disk | FTP | other *** search
/ Aminet 22 / Aminet 22 (1997)(GTI - Schatztruhe)[!][Dec 1997].iso / Aminet / util / misc / orysplit.lha / orysplit / orysplit.c < prev    next >
C/C++ Source or Header  |  1997-10-25  |  4KB  |  149 lines

  1. /* orysplit.c:
  2.  *   Split "rec.humor.oracle" archive files into single news articles again,
  3.  *   also cuts down these pesky dashed lines to at most 75 characters.
  4.  *   A filename like "001-005" is supposed to contain articles 1 through 5,
  5.  *   each starting with either a "Path: " or "From " line.
  6.  *   When done, it prints to stdout a number which it thinks is now the
  7.  *   highest article number in the directory, plus 1. (Go figure what that
  8.  *   might be useful for. ;)
  9.  * Cookie mode:
  10.  *   When you specify "-c", oracularities are copied to stdout, with lines 
  11.  *   of "%%" separating them (standard fortune cookie format).
  12.  */                          
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <string.h>
  16. #include <ctype.h>
  17. #include <assert.h>
  18.  
  19. #define LINELEN 100
  20.  
  21. void help()
  22. {
  23.   printf( "usage:\n  orysplit [ options ] <filename> \n" );
  24.   printf( "where <filename> must start with a digit,\n" );
  25.   printf( "and options are:\n" );
  26.   printf( "  -c    create cookies (written to stdout)\n" );
  27. }
  28.  
  29.  
  30. int main( int argc, char* argv[] )
  31. {
  32.   FILE *arcf, *artf;
  33.   int art, question = 1;
  34.   int cookiemode = 0, bodytext, legacy;
  35.   char line[ LINELEN ], fname[ 20 ];
  36.   char *s, *inpname = NULL;
  37.  
  38.   while( --argc )
  39.     {
  40.       argv++;
  41.       if( isdigit( *argv[0] ) )
  42.         inpname = argv[0];
  43.       else if( strcmp( argv[0], "-c" ) == 0 )
  44.         cookiemode = 1;
  45.       else
  46.         {
  47.           help();
  48.           return 10;
  49.         }
  50.     }
  51.   if( inpname == NULL )
  52.     {
  53.       help();
  54.       return 10;
  55.     }
  56.   /* art = atoi( inpname ); */
  57.   art = strtol( inpname, NULL, 10 );
  58.   arcf = fopen( inpname, "r" );
  59.   if( !arcf )
  60.     {
  61.       fprintf( stderr, "Can't open %s\n", inpname );
  62.       return 10;
  63.     }
  64.   artf = NULL;
  65.   bodytext = 0;
  66.   while( fgets( line, LINELEN, arcf ) != NULL )
  67.     {
  68.       if( strncmp( line, "Path: ", 6 ) == 0
  69.        || strncmp( line, "From ", 5 ) == 0 )
  70.         {
  71.           fprintf( stderr, "Article %d\n", art );
  72.           sprintf( fname, "%d", art );
  73.           if( artf )
  74.             fclose( artf );
  75.           if( !cookiemode )
  76.             {
  77.               artf = fopen( fname, "w" );
  78.               if( !artf )
  79.                 {
  80.                   fprintf( stderr, "Can't open %s for output\n", fname );
  81.                   return 10;
  82.                 }
  83.             }
  84.           art++;
  85.           question = 1;
  86.         }
  87.       if( cookiemode )
  88.         {
  89.           if( (*line == '>' && bodytext == 0)
  90.            || (strncmp( line, "The ", 4 ) == 0
  91.             && strstr( line, "has pondered" ) != NULL) )
  92.             {                                   /* start of an oracularity */
  93.               bodytext = 1;
  94.               legacy = ( strncmp( line+4, "Internet", 8 ) != 0 );
  95.               printf( "%s Oracularity #%03d-%02d\n\n", 
  96.                 legacy ? "Usenet" : "Internet", art-1, question );
  97.               question++;
  98.             }
  99.           if( strncmp( line, "And in response", 15 ) == 0 )
  100.             bodytext = 2;                       /* the Oracle's answer */
  101.           if( *line == '}' && bodytext == 2 )
  102.             bodytext = 3;
  103.           if( *line != '}' && bodytext == 3 )
  104.             {                                   /* end of answer */
  105.               bodytext = 0;                     /* -> end of oracularity */
  106.               printf( "%%%%\n" );
  107.             }
  108.           if( bodytext )
  109.             printf( "%s", line );
  110.         }
  111.       else if( artf )
  112.         {
  113.           if( strspn( line, "-=" ) > 75 )        /* line of dashes */
  114.             {
  115.               line[75] = '\n';
  116.               line[76] = '\0';
  117.             }
  118.           fprintf( artf, "%s", line );
  119.         }
  120.       else
  121.         {
  122.           if( (s = strchr( line, '\n' )) )
  123.             *s = '\0';
  124.           fprintf( stderr, "Had to drop a line: %.55s\n", line );
  125.         }
  126.     }
  127.   fclose( arcf );
  128.   if( artf )
  129.     fclose( artf );
  130.   if( bodytext )
  131.     printf( "%%%%\n" );
  132.   if( !cookiemode )
  133.     {                           /* propose a contents for the ".next" file */
  134.       artf = NULL;
  135.       do
  136.         {
  137.           sprintf( fname, "%d", art );
  138.           if( artf )
  139.             fclose( artf );
  140.           artf = fopen( fname, "r" );
  141.           art++;
  142.         }
  143.       while( artf );
  144.       printf( "%d\n", art-1 );
  145.     }
  146.   return 0;                  
  147. }
  148.  
  149.